如果每次部署的時候都要手動打包然後上傳到Lambda,實在不是一個聰明的方法,因此我們使用Github Action做為我們CI/CD的工具,如果是Github的一般用戶,一個月有2000分鐘的免費執行時間,其實也是足夠了。另外透過Github Action我們也能自動進行測試和檢核,之後串接codecov跟sonarcube來生成測試覆蓋率報告和做程式碼質量檢查。
首先為了能自動化操作AWS,所以我們要先拿到AWS的授權金鑰。登入AWS後,按右上角找到安全憑證
點擊建立存取金鑰,要記好[存取金鑰]&[私密存取金鑰],不然之後只能重新生成
接著我們要把上一步拿到的兩個金鑰讓Github Action能調用,所以我們把專案放上github後,要將兩把金鑰存進專案內,首先到專案頁面→設定→secerts→action→[New repo secret],把上一步的[存取金鑰]&[私密存取金鑰]存進去AWS_ACCESS_KEY_ID
跟AWS_SECRET_ACCESS_KEY
這樣就存好摟~
由於Github Action的行為都是透過yml定義的,我們先在專案下新增.github\workflows\aws-lambda.yml
像下面這樣:
記得沒有.github\workflows
這個路徑,要自己新增~
接著透過以下aws-lambda.yml的註解來了解Github Action的yml該如何撰寫,可以按照自己的需求調整這份yml就好了~
aws-lambda.yml
name: Build and test Go & Deploy to Lambda # 工作流程的名稱
on: # 定義觸發工作流程的事件
workflow_dispatch: # 允許手動觸發工作流程
push: # 當push到github時觸發工作流程
branches: # 指定只有分支為"master"和"feature-*"會觸發
- "master"
- "feature-*"
pull_request: # 當有新的PR開起、同步或重開時會觸發工作流程
types: [opened, synchronize, reopened]
branches: # 指定了觸發分支為"master"
- "master"
jobs: # 定義工作流程中的不同的jobs
Go-Test: # jobs名稱 (用於測試)
runs-on: ubuntu-latest # 指定運行這個job的運行環境
steps: # 定義了一系列步驟,每個步驟執行一個特定的操作
- name: Get project resource # 下載你的repo
uses: actions/checkout@v3
with:
fetch-depth: 0 # Shallow clones should be disabled for a better relevancy of analysis
- name: Setup Go # 設置Go環境
uses: actions/setup-go@v4
with:
go-version: '1.21' # 指定使用Go版本為1.21
- name: Run golangci-lint # 運行golangci-lint工具來進行Go代碼的靜態檢查
uses: golangci/golangci-lint-action@v3
# golangci-lint didn't merge below PR yet
with:
version: v1.53
args: --timeout 3m --verbose
# output-file: golangci-lint.out
Deploy-to-Lambda: # 第二個工作,用於部署Go應用程序到AWS Lambda
runs-on: ubuntu-latest
needs: [Go-Test] # 依賴於Go-Test,只有在Go-Test這個job跑成功時才會執行(測試過後)
if: ${{ github.ref == 'refs/heads/master'}} # 指定只有當GitHub分支為"master"時才運行這個job
steps:
- name: Configure AWS credentials # 設置AWS的身份驗證信息
uses: aws-actions/configure-aws-credentials@v1-node16
with:
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
aws-region: ap-northeast-1
# 前面與Go-Test相同
- name: Get project resource
uses: actions/checkout@v3
- name: Setup Go
uses: actions/setup-go@v4
with:
go-version: '1.21'
# 跟昨天手動部署的流程相同
- name: Build Lambda bootstrap
run: |
GOOS=linux GOARCH=amd64 go build -o bootstrap main.go
zip bootstrap.zip bootstrap
aws lambda update-function-code --function-name BaoSaveLineBot --zip-file fileb://bootstrap.zip
這樣只要當master有異動就會自動deploy到lambda上了,明天再來把codecov跟sonarcube加上去~